স্প্রিং সিকিউরিটিতে Role-Based Authorization এবং Permission-Based Authorization ব্যবহার করে সুনির্দিষ্ট অ্যাক্সেস নিয়ন্ত্রণ সহজেই বাস্তবায়ন করা যায়। নিচে দুটি কৌশলের জন্য উদাহরণসহ সম্পূর্ণ ব্যাখ্যা দেওয়া হলো:
১. Role-Based Authorization
কাজের মূলনীতি:
- ব্যবহারকারীকে বিভিন্ন Role (যেমন
ROLE_USER,ROLE_ADMIN) দেওয়া হয়। - সুনির্দিষ্ট পেজ বা API অ্যাক্সেস করার জন্য রোল যাচাই করা হয়।
উদাহরণ: Role-Based Authorization
Step 1: Maven/Gradle Dependencies
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Step 2: Security Configuration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN") // Role-based access
.requestMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
)
.formLogin()
.and()
.logout().permitAll();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Step 3: User Configuration (In-Memory User Store)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class UserConfig {
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
Step 4: Controller
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RoleController {
@GetMapping("/user/home")
public String userHome() {
return "Welcome to User Home";
}
@GetMapping("/admin/home")
public String adminHome() {
return "Welcome to Admin Home";
}
}
২. Permission-Based Authorization
কাজের মূলনীতি:
- প্রতিটি ব্যবহারকারীর নির্দিষ্ট Permission (যেমন
READ_PRIVILEGE,WRITE_PRIVILEGE) দেওয়া হয়। - ব্যবহৃত রিসোর্সে অ্যাক্সেস অনুমোদনের জন্য পারমিশন যাচাই করা হয়।
উদাহরণ: Permission-Based Authorization
Step 1: Security Configuration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/read").hasAuthority("READ_PRIVILEGE") // Permission-based access
.requestMatchers("/write").hasAuthority("WRITE_PRIVILEGE")
.anyRequest().authenticated()
)
.formLogin()
.and()
.logout().permitAll();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Step 2: Custom UserDetailsService
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.Arrays;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if ("reader".equals(username)) {
return new User(
"reader",
new BCryptPasswordEncoder().encode("password"),
Arrays.asList(new SimpleGrantedAuthority("READ_PRIVILEGE"))
);
} else if ("writer".equals(username)) {
return new User(
"writer",
new BCryptPasswordEncoder().encode("password"),
Arrays.asList(
new SimpleGrantedAuthority("READ_PRIVILEGE"),
new SimpleGrantedAuthority("WRITE_PRIVILEGE")
)
);
} else {
throw new UsernameNotFoundException("User not found");
}
}
}
Step 3: Controller
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PermissionController {
@GetMapping("/read")
public String readAccess() {
return "You have read access!";
}
@GetMapping("/write")
public String writeAccess() {
return "You have write access!";
}
}
উপসংহার
| বৈশিষ্ট্য | Role-Based Authorization | Permission-Based Authorization |
|---|---|---|
| অ্যাক্সেস কন্ট্রোল স্তর | সম্পূর্ণ রোল দ্বারা নিয়ন্ত্রিত | সুনির্দিষ্ট পারমিশন দ্বারা নিয়ন্ত্রিত |
| ব্যবহারকারীর নিয়ন্ত্রণ | সাধারণ এবং সীমিত নিয়ন্ত্রণ | আরও সূক্ষ্ম (Fine-Grained) নিয়ন্ত্রণ |
| উদাহরণ | hasRole("ADMIN") | hasAuthority("WRITE_PRIVILEGE") |
উপসংহার:
- Role-Based Authorization সহজ এবং দ্রুত বাস্তবায়নের জন্য কার্যকর।
- Permission-Based Authorization যখন জটিল এবং সূক্ষ্ম নিয়ন্ত্রণ প্রয়োজন হয় তখন প্রয়োজনীয়।
আপনার প্রজেক্টের প্রয়োজন অনুযায়ী এই দুইটি পদ্ধতির মধ্যে যেকোনো একটি বা উভয় একসাথে ব্যবহার করতে পারেন।
Content added By
Read more